package Dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import Conexao.ConnectionManager;
import Modelo.Aluno;
import Modelo.AlunoSI;
import Modelo.Funcionario;
import Modelo.Movimentacao;
import Modelo.Visitante;

public class MovimentacaoDaoImp implements MovimentacaoDao {
	

	private final String INSERT = "insert into Movimentacao (horarioEntrada, horarioSaida, diaEntrada, diaSaida, IdAluno, IdFuncionario, acesso, iDAlunoSi) values (?,?,?,?,?,?,?,?)";
	private final String UPDATE = "update Movimentacao set horarioEntrada = ?, horarioSaida = ?, diaEntrada = ?, diaSaida = ?, IdAluno = ?, IdFuncionario = ?, acesso = ?, iDAlunoSi = ? where IdMovimento= ?";
	private final String DELETE = "delete from Movimentacao where IdMovimento = ?";
	private final String ALL = "select * from Movimentacao";
	private final String IDALUNO = "select * from Movimentacao where idAluno = ?";
	private final String IDFUNCIONARIO = "select * from Movimentacao where idFuncionario = ?";

	private static Connection connection;
	
	public MovimentacaoDaoImp() {
		openConnection();
	

}

	@Override
	public Movimentacao salvar(Movimentacao e) {
		try {
			PreparedStatement ps = null;

			ps = ConnectionManager.getInstance().getConnection()
					.prepareStatement(INSERT);
    
			ps.setObject(1, e.getHorarioEntrada());
			ps.setObject(2, e.getHorarioSaida());
			ps.setObject(3, e.getDiaEntrada());
			ps.setObject(4, e.getDiaSaida());
			if(e.getAluno() == null){
			ps.setObject(5, null);
			}else{
				ps.setObject(5, e.getAluno().getIdAluno());
			}
			if(e.getFuncionario() == null){
			ps.setObject(6, null);
			}else{
				ps.setObject(6, e.getFuncionario().getIdFuncionario());
			}
			if(e.getVisitante() == null){
			ps.setObject(7, null);
			}else{
				ps.setObject(7, e.getVisitante().getAcesso());
			}
			if(e.getAlunoSi() == null){                      
			ps.setObject(8, null);
			}else{
				ps.setObject(8, e.getAlunoSi().getIdAlunoSi());
			}
			
			
			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(MovimentacaoDaoImp.class.getName()).log(Level.SEVERE,
					null, ex);
		} finally {
			this.closeConnection();
		}
		return e;
	}
	

	@Override
	public void alterar(Movimentacao e) {
		PreparedStatement ps = null;
		try {
			ps = connection.prepareStatement(UPDATE);

			
			ps.setObject(1, e.getHorarioEntrada());
			ps.setObject(2, e.getHorarioSaida());
			ps.setObject(3, e.getDiaEntrada());
			ps.setObject(4, e.getDiaSaida());
			if(e.getAluno() == null){
			ps.setObject(5, null);
			}else{
				ps.setObject(5, e.getAluno().getIdAluno());
			}
			if(e.getFuncionario() == null){
			ps.setObject(6, null);
			}else{
				ps.setObject(6, e.getFuncionario().getIdFuncionario());
			}
			if(e.getVisitante() == null){
			ps.setObject(7, null);
			}else{
				ps.setObject(7, e.getVisitante().getAcesso());
			}
			if(e.getAlunoSi() == null){                      
			ps.setObject(8, null);
			}else{
				ps.setObject(8, e.getAlunoSi().getIdAlunoSi());
			}
			ps.setObject(9, e.getIdMovimento());
			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(MovimentacaoDaoImp.class.getName()).log(Level.SEVERE,
					null, ex);
		} finally {
			this.closeConnection();
		}	
	
	}

	@Override
	public void deletar(Movimentacao e) {
		try {
			PreparedStatement ps = null;
			ps = connection.prepareStatement(DELETE);

			ps.setObject(1, e.getIdMovimento());

			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(MovimentacaoDaoImp.class.getName()).log(Level.SEVERE,
					null, ex);
		} finally {
			this.closeConnection();
		}
	}

	@Override
	public List<Movimentacao> findAll() {
		List<Movimentacao> movimentos = new ArrayList<Movimentacao>();

		try {
			PreparedStatement ps = null;
			ResultSet rs = null;

			ps = connection.prepareStatement(ALL);

			rs = ps.executeQuery();

			while (rs.next()) {
				Movimentacao movimentacao = new Movimentacao();
				movimentacao.setIdMovimento(rs.getInt("idMovimento"));
				movimentacao.setHorarioEntrada(rs.getTime("HorarioEntrada"));
				movimentacao.setHorarioSaida(rs.getTime("HorarioSaida"));
				movimentacao.setDiaEntrada(rs.getDate("DiaEntrada"));
				movimentacao.setDiaSaida(rs.getDate("diaSaida"));
				Aluno aluno = DAOFactory.getAlunoDao().BuscarPorId(rs.getInt("idAluno"));
				movimentacao.setAluno(aluno);
				Funcionario funcionario = DAOFactory.getFuncionarioDao().buscarPorId(rs.getInt("idFuncionario"));
				movimentacao.setFuncionario(funcionario);
				Visitante visitante = DAOFactory.getvisitaDAO().BuscarPorAcesso(rs.getInt("acesso"));
				movimentacao.setVisitante(visitante);
				AlunoSI alunoSI = DAOFactory.getAlunoSiDao().BuscarPorId(rs.getInt("idAlunoSi"));
				movimentacao.setAlunoSi(alunoSI);
				movimentos.add(movimentacao);
	
			}

		} catch (SQLException ex) {
			Logger.getLogger(MovimentacaoDaoImp.class.getName()).log(Level.SEVERE,
					null, ex);
		} finally {
			this.closeConnection();
		}
		return movimentos;
	}

	@Override
	public boolean isConnectionClose() {
		try {
			return connection.isClosed();
		} catch (SQLException ex) {
			return false;
		}
	
	}

	@Override
	public void openConnection() {
		if (connection == null) {
			connection = ConnectionManager.getInstance().getConnection();
		}

		if (isConnectionClose()) {
			connection = ConnectionManager.getInstance().getConnection();
		}
	}


	@Override
	public void closeConnection() {
		if (connection != null && !this.isConnectionClose()) {
			ConnectionManager.getInstance().closeConnection(connection);
		}
	}

	@Override
	public List<Movimentacao> listarOsHorariosDosAlunos(int idAluno) {
		List<Movimentacao> movimentos = new ArrayList<Movimentacao>();

		try {
		PreparedStatement ps = null;
		ResultSet rs = null;

		ps = connection.prepareStatement(IDALUNO);
		ps.setObject(1, idAluno);

		rs = ps.executeQuery();

		while (rs.next()) {
			Movimentacao movimentacao = new Movimentacao();
			movimentacao.setHorarioEntrada(rs.getTime("HorarioEntrada"));
			movimentacao.setHorarioSaida(rs.getTime("HorarioSaida"));
			movimentacao.setDiaEntrada(rs.getDate("DiaEntrada"));
			movimentacao.setDiaSaida(rs.getDate("diaSaida"));
			Aluno aluno = DAOFactory.getAlunoDao().BuscarPorId(rs.getInt("idAluno"));
			movimentacao.setAluno(aluno);
			Funcionario funcionario = DAOFactory.getFuncionarioDao().buscarPorId(rs.getInt("idFuncionario"));
			movimentacao.setFuncionario(funcionario);
			Visitante visitante = DAOFactory.getvisitaDAO().BuscarPorAcesso(rs.getInt("acesso"));
			movimentacao.setVisitante(visitante);
			AlunoSI alunoSI = DAOFactory.getAlunoSiDao().BuscarPorId(rs.getInt("idAlunoSi"));
			movimentacao.setAlunoSi(alunoSI);
			movimentacao.setIdMovimento(rs.getInt("idMovimento"));
			movimentos.add(movimentacao);
		}

		} catch (SQLException ex) {
		Logger.getLogger(FuncionarioDaoImp.class.getName()).log(Level.SEVERE,
		null, ex);
		} finally {
		this.closeConnection();
		}
		if (movimentos.isEmpty()) {
		return null;
		} else {
		return movimentos;
		}
	}

	@Override
	public List<Movimentacao> listarHorarioFuncionario(int idFuncionario) {
		List<Movimentacao> movimentos = new ArrayList<Movimentacao>();

		try {
		PreparedStatement ps = null;
		ResultSet rs = null;

		ps = connection.prepareStatement(IDFUNCIONARIO);
		ps.setObject(1, idFuncionario);

		rs = ps.executeQuery();

		while (rs.next()) {
			Movimentacao movimentacao = new Movimentacao();
			movimentacao.setHorarioEntrada(rs.getTime("HorarioEntrada"));
			movimentacao.setHorarioSaida(rs.getTime("HorarioSaida"));
			movimentacao.setDiaEntrada(rs.getDate("DiaEntrada"));
			movimentacao.setDiaSaida(rs.getDate("diaSaida"));
			Aluno aluno = DAOFactory.getAlunoDao().BuscarPorId(rs.getInt("idAluno"));
			movimentacao.setAluno(aluno);
			Funcionario funcionario = DAOFactory.getFuncionarioDao().buscarPorId(rs.getInt("idFuncionario"));
			movimentacao.setFuncionario(funcionario);
			Visitante visitante = DAOFactory.getvisitaDAO().BuscarPorAcesso(rs.getInt("acesso"));
			movimentacao.setVisitante(visitante);
			AlunoSI alunoSI = DAOFactory.getAlunoSiDao().BuscarPorId(rs.getInt("idAlunoSi"));
			movimentacao.setAlunoSi(alunoSI);
			movimentacao.setIdMovimento(rs.getInt("idMovimento"));
			movimentos.add(movimentacao);
		}

		} catch (SQLException ex) {
		Logger.getLogger(FuncionarioDaoImp.class.getName()).log(Level.SEVERE,
		null, ex);
		} finally {
		this.closeConnection();
		}
		if (movimentos.isEmpty()) {
		return null;
		} else {
		return movimentos;
		}
	}
}
